const md5 = require('md5');
const sequelize = require('./db');
require('./foreignKeyVis');

// 引入model
const { adminModel } = require('./model/admin');
const { bannerModel } = require('./model/banner');
const { blogModel } = require('./model/blog');
const { blogTypeModel } = require('./model/blogType');
const { projectModel } = require('./model/project');
const { settingModel } = require('./model/setting');
const { aboutModel } = require('./model/about');
const { messageModel } = require('./model/message');

console.log(projectModel);

(async () => {
	// 定义博客和博客分类之间的关系，blogModel 的外键 categoryId 对应到 blogTypeModel 的主键 id
	// 一个分类可以有多篇文章，一篇文章只属于一个分类
	blogTypeModel.hasMany(blogModel, { foreignKey: 'categoryId', targetKey: 'id' });
	blogModel.belongsTo(blogTypeModel, { foreignKey: 'categoryId', targetKey: 'id', as: 'category' });

	// 文章与评论的关联关系
	blogModel.hasMany(messageModel, { foreignKey: 'blogId', targetKey: 'id' });
	messageModel.belongsTo(blogModel, { foreignKey: 'blogId', targetKey: 'id', as: 'blog' });

	// 模型变化再进行同步(alter: true 频繁保存会生成很多连接线, 使用 force: true 重置数据库)
	if (process.env.NODE_ENV == 'development') {
		// await sequelize.sync({ alter: true });
		// console.log('统一同步完成');
	} else {
		await sequelize.sync({ alter: true });
		console.log('统一同步完成');
	}

	// 初始化数据
	// 管理员模型
	initAdmin();

	// 首页标语
	initBanner();

	// 初始化其他
	init();

	// 管理员模型
	async function initAdmin() {
		const adminCount = await adminModel.count();
		if (process.env.NODE_ENV == 'development') {
			// 如果是空表就模拟数据
			if (!adminCount) {
				await adminModel.create({
					loginId: 'admin',
					name: '超级管理员',
					loginPwd: md5('123456')
				});
				require('../mock/mockAdmin');
			}
			console.log('开发环境初始化数据完毕...');
		} else {
			if (!adminCount) {
				await adminModel.create({
					loginId: 'admin',
					name: '超级管理员',
					loginPwd: md5('123456')
				});
			}
			console.log('表数据初始化完毕...');
		}
	}

	// 首页标语模型
	async function initBanner() {
		const bannerCount = await bannerModel.count();
		// 如果是空表就模拟数据
		if (!bannerCount) {
			await bannerModel.bulkCreate([
				{
					midImg: '/static/images/bg1_mid.jpg',
					bigImg: '/static/images/bg1_big.jpg',
					title: '塞尔达旷野之息',
					description: '2017年年度游戏，期待续作'
				},
				{
					midImg: '/static/images/bg2_mid.jpg',
					bigImg: '/static/images/bg2_big.jpg',
					title: '塞尔达四英杰',
					description: '四英杰里面你最喜欢的又是谁呢'
				},
				{
					midImg: '/static/images/bg3_mid.jpg',
					bigImg: '/static/images/bg3_big.jpeg',
					title: '日本街道',
					description: '动漫中经常出现的日本农村街道，一份独特的恬静'
				}
			]);
			console.log('初始化首页标语数据...');
		}
	}

	// 初始化其他
	async function init() {
		// 初始化设置
		const settingCount = await settingModel.count();
		if (!settingCount) {
			await settingModel.create({
				avatar: '/static/images/avatar.jpeg',
				siteTitle: '我的个人空间',
				github: '',
				qq: '3263023350',
				qqQrCode: '/static/images/zuotian9652.jpg',
				weixin: 'yh777bao',
				weixinQrCode: '/static/images/zuotian9652.jpg',
				mail: 'duyi@gmail.com',
				icp: '黑ICP备17001719号',
				githubName: 'DuYi-Edu',
				favicon: 'http://mdrs.yuanjin.tech/Fs4CDlC6mwe_WXLMIiXcmSJLHO4f'
			});
		}

		// 初始化关于
		const aboutCount = await aboutModel.count();
		if (!aboutCount) {
			await aboutModel.create({
				url: 'https://gitee.com/lzo-gitee/lzo-mysite-express'
			});
		}

		// 初始化文章类型
		const blogTypeCount = await blogTypeModel.count();
		if (!blogTypeCount) {
			await blogTypeModel.create({
				name: '类型一',
				articleCount: 0
			});
		}
	}
})();
